package com.google.gwt.chart.client;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.*;
import com.google.gwt.widgetideas.graphics.client.GWTCanvas;

//=========================================================================
/**
 * Title:        Canvas <br>
 * Description:  $defaultDesc$<br>
 * Copyright:    Apache Public License 2.0<br>
 * Company:      $company$<br>
 * @author James Hutton
 */
//=========================================================================
public class Canvas
		extends GWTCanvas
		implements SourcesMouseEvents, SourcesClickEvents {

	private MouseListenerCollection mouseListeners = new MouseListenerCollection();
	private ClickListenerCollection clickListeners = new ClickListenerCollection();

	//=========================================================================
	/**
	 * Constructs a Canvas
	 */
	//=========================================================================
	public Canvas() {
		super();
		sinkEvents(Event.MOUSEEVENTS | Event.ONCLICK);
	}

	//=========================================================================
	/**
	 * Constructs a Canvas
	 * @param width - 
	 * @param height - 
	 */
	//=========================================================================
	public Canvas(int width, int height) {
		this();
		resize(width, height);
	}

	//=========================================================================
	/**
	 * Method onBrowserEvent
	 * @param e
	 */
	//=========================================================================
	public void onBrowserEvent(Event e) {

		super.onBrowserEvent(e);
		if (DOM.eventGetType(e) == Event.ONCLICK) {
			clickListeners.fireClick(this);
		}
		else if (DOM.eventGetType(e) == Event.ONMOUSEMOVE) {
			mouseListeners.fireMouseMove(this, e.getClientX(), e.getClientY());
		}
		else if (DOM.eventGetType(e) == Event.ONMOUSEDOWN) {
			mouseListeners.fireMouseDown(this, e.getClientX(), e.getClientY());
		}
		else if (DOM.eventGetType(e) == Event.ONMOUSEUP) {
			mouseListeners.fireMouseUp(this, e.getClientX(), e.getClientY());
		}

	}

	//=========================================================================
	/**
	 * Method getHeight
	 * @return int
	 */
	//=========================================================================
	public int getHeight() {

		String height = DOM.getStyleAttribute(getElement(), "height");
		if (height.endsWith("px")) {
			height = height.substring(0, height.length() - 2);
		}
		return Integer.parseInt(height);

	}

	//=========================================================================
	/**
	 * Method getWidth
	 * @return int
	 */
	//=========================================================================
	public int getWidth() {

		String width = DOM.getStyleAttribute(getElement(), "width");
		if (width.endsWith("px")) {
			width = width.substring(0, width.length() - 2);
		}
		return Integer.parseInt(width);

	}

	//=========================================================================
	/**
	 * Method addMouseListener
	 * @param m
	 */
	//=========================================================================
	public void addMouseListener(MouseListener m) {
		mouseListeners.add(m);
	}

	//=========================================================================
	/**
	 * Method removeMouseListener
	 * @param m
	 */
	//=========================================================================
	public void removeMouseListener(MouseListener m) {
		mouseListeners.remove(m);
	}

	//=========================================================================
	/**
	 * Method addClickListener
	 * @param c
	 */
	//=========================================================================
	public void addClickListener(ClickListener c) {
		clickListeners.add(c);
	}

	//=========================================================================
	/**
	 * Method removeClickListener
	 * @param c
	 */
	//=========================================================================
	public void removeClickListener(ClickListener c) {
		clickListeners.remove(c);
	}
}

